import "package:flutter/material.dart";

class AnimationPage extends StatefulWidget {
  const AnimationPage({super.key});
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _AnimationPageState();
  }
}

// //需要继承TickerProvider，如果有多个AnimationController，则应该使用TickerProviderStateMixin。
class _AnimationPageState extends State<AnimationPage>
    with SingleTickerProviderStateMixin {
  late Animation<double> _animation;
  late AnimationController _animationController;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // 初始化控制器
    _animationController = AnimationController(
      duration: const Duration(seconds: 2),
      // AnimationController生成数字的区间可以通过lowerBound和upperBound来指定
      // 当使用 AnimationController 来驱动其他动画相关的类（如 Tween 或 Curve）时，这个下限值将影响动画的起始值。
      lowerBound: 0, //默认0。Tween的end会乘上该值的倍数作为最小值 300
      upperBound: 1, //默认1。Tween的end会乘上该值的倍数作为最大值 600
      vsync: this, //需要传递一个vsync参数，它接收一个TickerProvider类型的对象，它的主要职责是创建Ticker
    );
    // 添加动画曲线
    _animation =
        CurvedAnimation(parent: _animationController, curve: Curves.bounceIn);
    // 初始动画变量
    // 要使用 Tween 对象，需要调用其animate()方法，然后传入一个控制器对象。取从0-300的值
    _animation = Tween(begin: 0.0, end: 300.0).animate(_animationController)
      ..addListener(() {
        setState(() {
          // 函数调用了setState()，所以每次动画生成一个新的数字时，当前帧被标记为脏(dirty)，这会导致widget的build()方法再次被调用
        });
      })
      // 监听动画执行状态
      ..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          _animationController.reverse();
        } else if (status == AnimationStatus.dismissed) {
          _animationController.forward();
        }
      });
    _animationController.forward(); //正向执行动画
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _animationController.dispose(); //释放动画资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AnimationPage'),
      ),
      body: Center(
        child: Image.asset(
          "./images/1.jpg",
          width: _animation.value,
          height: _animation.value,
          fit: BoxFit.cover,
        ),
      ),
    );
  }
}
